home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************************
- * nextfile.c: 下層テキストのロード処理
- ******************************************************************************
- *
- *
- */
- #include <sxdef2.h>
- #include <zmusic.h>
- #include <direct.h>
- #include <stdio.h>
- #include <iocslib.h>
- #include <stdlib.h>
- #include <string.h>
- #include <io.h>
- #include <jfctype.h>
- #include <doslib.h>
- #include <direct.h>
- #include <event.h> /* イベントマンを利用するときに必要 */
- #include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
- #include <window.h> /* ウィンドウマンを利用するときに必要 */
- #include <control.h> /* コントロールマンを利用するときに必要 */
- #include <dialog.h> /* ダイアログマンを利用するときに必要 */
- #include <task.h> /* タスクマンを利用するときに必要 */
- #include "DC.h" /* このプログラム固有のヘッダファイル */
-
- /******************************************************************************
- * nextfile(): 下層テキストのロード
- ******************************************************************************
- * 引数: ComVal *pcv 共通変数へのポインタ
- */
- void nextfile(ComVal *pcv)
- {
- char buff[256],buff2[512];
- char tempfname[90],taskfname[90],comexe[90],execfname[90];
- LPoint mpos;
- int comline,err = 0,i,res;
- char *txtPt,*comPt;
- int *txtNo;
- FILE *fn;
- void **pcm;
- char *dmy;
- long fileLen;
- char drv[TS_NAMEMAX],path[TS_NAMEMAX],node[TS_NAMEMAX],ext[TS_NAMEMAX];
- IcState *icon;
-
- char com[256];
- int comNo;
- char command[90];
- char param[90];
- char destfname[90];
- char docfname[90];
- char newfname[90];
- char docPath[90];
-
- int type; /* 1:doc,2:pcm,3:opm,4:ede,5:exe,6:cli */
-
- com[0] = 0;
- path[0] = 0;
- command[0] = 0;
- param[0] = 0;
- destfname[0] = 0;
- docfname[0] = 0;
- newfname[0] = 0;
- docPath[0] = 0;
-
-
- mpos = EMMSLoc();
- comline = pcv->ofset + LOWWORD(mpos) / pcv->fontS[pcv->font];
-
- if (pcv->Maxline < comline)
- return;
-
- MMHdlLock(pcv->txt); /* テキストブロックのハンドルをロック */
- MMHdlLock(pcv->txtNo);
-
- txtPt = *(pcv->txt);
- txtNo = *(pcv->txtNo);
-
- txtPt = txtPt + *(txtNo + comline);
-
- if (!strncmp(txtPt, "◎", 2)) { /* コマンドラインか? */
- while(strncmp(txtPt, "TYPE=", 5)) {
- if (*txtPt == 13) {
- err = 1;
- break;
- }
- txtPt++;
- }
- if (err) return;
- comPt = &buff[0];
- while(*txtPt != 13) {
- *comPt++ = *txtPt++;
- }
- *comPt = 0;
-
-
- comPt = &buff[0] + 5;
- while(*comPt != 0) { /* '/' なんか使うなよ */
- if ((*comPt != ' ') && (*(comPt+1) == '/')) {
- *(comPt+1) = '\\';
- comPt++;
- }
- comPt++;
- }
- comPt = &buff[0] + 5;
-
- if (!strncmp(comPt, "DOC", 3)) { /* TYPEの設定 */
- type = 1;
- } else if (!strncmp(comPt, "PCM", 3)) {
- type = 2;
- } else if (!strncmp(comPt, "OPM", 3)) {
- type = 3;
- } else if (!strncmp(comPt, "EDE", 3)) {
- type = 4;
- } else if (!strncmp(comPt, "EXE", 3)) {
- type = 5;
- } else if (!strncmp(comPt, "CLI", 3)) {
- type = 6;
- } else if (!strncmp(comPt, "COP", 3)) {
- type = 7;
- } else if (!strncmp(comPt, "DCV", 3)) {
- type = 8;
- } else {
- type = 99;
- }
-
- comPt = comPt + 3;
- readcom(pcv, comPt, type, path, command, param, destfname, docfname, docPath);
-
- switch(type) {
- case 1: /* DOCの場合 */
- strcpy(&(pcv->pastFname[pcv->pastFno][0]),
- pcv->currentFname);
- pcv->pastofset[pcv->pastFno] = pcv->ofset;
-
- strcpy(&(pcv->pastPath[pcv->pastFno][0]),
- pcv->currentPath);
- structfname(pcv, path, docfname, pcv->currentFname);
- strcpy(pcv->currentPath, docPath);
-
- if (GetData(pcv, pcv->currentFname)) {
- pcv->pastFno = pcv->pastFno + 1;
- CMShine(pcv->btn12Hdl,C_ACTIVE);
- drawGraph(pcv, 0);
- } else {
- strcpy(pcv->currentFname,
- &(pcv->pastFname[pcv->pastFno][0]));
- strcpy(pcv->currentPath,
- &(pcv->pastPath[pcv->pastFno][0]));
- pcv->errorCode = 0;
- return;
- }
- break;
-
- case 2: /* PCMの場合 */
- structfname(pcv, path, docfname, tempfname);
- play_pcm(pcv, tempfname);
- break;
-
- case 3: /* OPMの場合 */
- if (!LOWWORD(zm_ver())) {
- DMError(D_CONFIRM, "ZMUSIC が常駐していません!");
- return;
- }
- structfname(pcv, path, docfname, tempfname);
- play_music(pcv, tempfname);
- break;
-
- case 4: /* EDEの場合 */
- strcpy(&(pcv->pastFname[pcv->pastFno][0]),
- pcv->currentFname);
- pcv->pastofset[pcv->pastFno] = pcv->ofset;
- strcpy(&(pcv->pastPath[pcv->pastFno][0]),
- pcv->currentPath);
- structfname(pcv, path, destfname, taskfname);
-
- for(i=0;i<strlen(destfname);i++) {
- if (*(destfname+i) == '|') {
- *(destfname+i) = 0;
- break;
- }
- }
-
- if ((!strcmp(command, "PIC") || !strcmp(command, "PIC.R") || !strncmp(command, "GP11", 4)
- || !strncmp(command, "KT", 2) || !strncmp(command, "JPEGED", 6) || !strncmp(command, "JPGL", 4)
- || !strncmp(command, "PIC2", 4) || !strncmp(command, "GLM", 3)) && pcv->picTask) {
- disp_pic(pcv, command, path, destfname, taskfname);
- }
-
- structfname(pcv, path, docfname, pcv->currentFname);
- strcpy(pcv->currentPath, docPath);
-
- if (GetData(pcv, pcv->currentFname)) {
- pcv->pastFno = pcv->pastFno + 1;
- CMShine(pcv->btn12Hdl,C_ACTIVE);
- drawGraph(pcv, 0);
- } else {
- strcpy(pcv->currentFname,
- &(pcv->pastFname[pcv->pastFno][0]));
- strcpy(pcv->currentPath,
- &(pcv->pastPath[pcv->pastFno][0]));
- pcv->errorCode = 0;
- return;
- }
- break;
-
- case 5: /* EXE,CLIの場合 */
- case 6:
- if (pcv->activeFlag && (pcv->event.ev.how & KS_SHIFT))
- execDos(pcv, pcv->execCom, path, type);
-
- for(i=0;i<strlen(destfname);i++) {
- if (*(destfname+i) == '|') {
- *(destfname+i) = 0;
- break;
- }
- }
-
- if ((!strcmp(command, "PIC") || !strcmp(command, "PIC.R") || !strncmp(command, "GP11", 4)
- || !strncmp(command, "KT", 2) || !strncmp(command, "JPEGED", 6) || !strncmp(command, "JPGL", 4)
- || !strncmp(command, "PIC2", 4) || !strncmp(command, "GLM", 3)) && pcv->picTask) {
- disp_pic(pcv, command, path, destfname, taskfname);
- break;
- }
-
- if (!strcmp(command, "COPY")) {
- comPt += 6;
- for(i=0;i<strlen(comPt);i++) {
- if (*(comPt+i) == ' ') {
- *(comPt+i) = 0;
- break;
- }
- }
- sprintf(destfname, "A:%s", comPt);
- structfname(pcv, path, destfname, taskfname);
- if (!strcmp(comPt+i+1, "OPM"))
- play_music(pcv, taskfname);
- else
- play_pcm(pcv, taskfname);
- break;
- }
- break;
- case 7: /* COPの場合 */
- comPt++;
- for(i=0;i<strlen(comPt);i++) {
- if (*(comPt+i) == ' ') {
- *(comPt+i) = 0;
- break;
- }
- }
- structfname(pcv, path, comPt, taskfname);
- if (!strcmp(comPt+i+1, "OPM"))
- play_music(pcv, taskfname);
- else
- play_pcm(pcv, taskfname);
- break;
- case 8: /* DCVの場合 */
- strcpy(&(pcv->pastFname[pcv->pastFno][0]),
- pcv->currentFname);
- pcv->pastofset[pcv->pastFno] = pcv->ofset;
-
- strcpy(&(pcv->pastPath[pcv->pastFno][0]),
- pcv->currentPath);
- strcpy(pcv->currentFname, comPt + 1);
- strcpy(pcv->currentPath, docPath);
-
- if (GetData(pcv, pcv->currentFname)) {
- pcv->pastFno = pcv->pastFno + 1;
- CMShine(pcv->btn12Hdl,C_ACTIVE);
- drawGraph(pcv, 0);
- } else {
- strcpy(pcv->currentFname,
- &(pcv->pastFname[pcv->pastFno][0]));
- strcpy(pcv->currentPath,
- &(pcv->pastPath[pcv->pastFno][0]));
- pcv->errorCode = 0;
- return;
- }
- break;
- }
- }
- MMHdlUnlock(pcv->txtNo); /* テキストブロックのハンドルをアンロック */
- MMHdlUnlock(pcv->txt);
- }
-
- /******************************************************************************
- * readcom(): コマンドライン解析
- ******************************************************************************
- * 引数: ComVal *pcv 共通変数へのポインタ
- */
- int readcom(ComVal *pcv, char *comPt, int type, char *path, char *command, char *param, char *destfname, char *docfname, char *docPath)
- {
- int i, comlen, partlen;
- char *doc;
- char buff[90];
-
- *path = 0;
- *command = 0;
- *param = 0;
- *destfname = 0;
- *docfname = 0;
-
- if (*comPt == ';' || *comPt == ',') { /* カレントパスの変更 */
- comPt++;
- if (!strncmp(comPt, "CD=", 3) || !strncmp(comPt, "CK=", 3)) {
- comPt = comPt + 3;
-
- if (*comPt == '\\') {
- if (!strncmp(pcv->currentFname, pcv->a_drv, strlen(pcv->a_drv)))
- sprintf(buff, "A:%s", comPt);
- else
- sprintf(buff, "B:%s", comPt);
-
- strcpy(comPt,buff);
- }
-
- i = 0;
- while(1) {
- if (*(comPt + i) == ':')
- if (*(comPt + i + 1) != '\\')
- break;
- i++;
- }
- strncpy(path, comPt, i);
- path[i] = 0;
- comPt = comPt + i;
-
- if (type == 1 || type == 4)
- structfname(pcv, path, "", docPath);
-
- } else {
- while(*comPt != ':') {
- comPt++;
- }
- }
- } else {
- strcpy(docPath, pcv->currentPath);
- }
-
- pcv->execCom = comPt; /* execDos()に渡す文字列 */
-
- if (*comPt == ':') { /* コマンドライン解析 */
- comPt++;
- if (*comPt == ' ')
- comPt++;
- while(*comPt == '+' || *comPt == '-' || *comPt == '*' || *comPt == ':') {
- comPt++;
- }
-
- if (*comPt == '\\') {
- if (!strncmp(pcv->currentFname, pcv->a_drv, strlen(pcv->a_drv)))
- sprintf(buff, "A:%s", comPt);
- else
- sprintf(buff, "B:%s", comPt);
-
- strcpy(comPt,buff);
- }
-
- switch(type) {
- case 1: /* DOC,PCM,OPM */
- case 2:
- case 3:
- strcpy(docfname, comPt);
- break;
- case 4: /* EDE */
- doc = strchr(comPt, ';');
- if (doc == NULL)
- break;
-
- partlen = strlen(comPt) - strlen(doc);
- strncpy(buff, comPt, partlen);
- buff[partlen] = 0;
- apartcom(pcv, buff, command, param, destfname);
- doc++;
- if (*doc == '\\') {
- if (!strncmp(pcv->currentFname, pcv->a_drv, strlen(pcv->a_drv))) {
- sprintf(buff, "A:%s", doc);
- } else if (!strncmp(pcv->currentFname, pcv->b_drv, strlen(pcv->b_drv))) {
- sprintf(buff, "B:%s", doc);
- } else {
- sprintf(buff, "C:%s", doc);
- }
- strcpy(doc,buff);
- }
- strcpy(docfname, doc);
- break;
- case 5: /* EXE,CLI */
- case 6:
- apartcom(pcv, comPt, command, param, destfname);
- break;
- }
- }
- }
-
- int apartcom(ComVal *pcv, char *comPt, char *command, char *param, char *destfname)
- /* EXE,CLIの場合のコマンドの抽出
- * マルチ処理の場合は最後のコマンドのみ抽出する。
- */
- {
- int i, i1, i2, i3, comlen;
- char buff[90];
-
- param[0] = 0;
- comlen = strlen(comPt);
-
- for(i=comlen;i>0;i--) {
- if (*(comPt + i) == ' ')
- break;
- }
- if (i == 0 || *(comPt + i) == ':') {
- strcpy(command, comPt + i);
- destfname[0] = 0;
- } else {
- i1=i;
- i2=i;
- i3=i;
- for(i=i;i>0;i--) {
- if (*(comPt + i) == ' ')
- i2=i;
- if (*(comPt + i) == ':' || *(comPt + i - 1) == '|')
- break;
- }
- if (i == 0) {
- strncpy(command, comPt, i2);
- command[i2] = 0;
- } else if (i2 == i3) {
- strncpy(command, comPt + i, i2 - i);
- command[i2 - i] = 0;
- } else {
- strncpy(command, comPt + i, i2 - i);
- command[i2++ - i] = 0;
- strncpy(param, comPt + i2, i3 - i2);
- param[i3 - i2] = 0;
- }
-
- comPt = comPt + i3 + 1;
- if (*comPt == '\\') {
- if (!strncmp(pcv->currentFname, pcv->a_drv, strlen(pcv->a_drv))) {
- sprintf(buff, "A:%s", comPt);
- } else if (!strncmp(pcv->currentFname, pcv->b_drv, strlen(pcv->b_drv))) {
- sprintf(buff, "B:%s", comPt);
- } else {
- sprintf(buff, "C:%s", comPt);
- }
- strcpy(comPt,buff);
- }
- strcpy(destfname, comPt);
- }
- command = stoupper(command);
- }
-
- int structfname(ComVal *pcv, char *newpath, char *name, char *newfname)
- /* ファイルネームをカレントパスとnodeから作成する。
- */
- {
- char drv[90], path[90], node[90], ext[90];
-
- if (!strncmp(name, "A:", 2) || !strncmp(name, "a:", 2)) {
- if (*(name+2) == '\\') {
- sprintf(newfname, "%s\\%s", pcv->a_drv, &name[3]);
- } else {
- sprintf(newfname, "%s\\%s", pcv->a_drv, &name[2]);
- }
-
- } else if (!strncmp(name, "B:", 2) || !strncmp(name, "b:", 2)){
- if (*(name+2) == '\\') {
- sprintf(newfname, "%s\\%s", pcv->b_drv, &name[3]);
- } else {
- sprintf(newfname, "%s\\%s", pcv->b_drv, &name[2]);
- }
-
- } else if (!strncmp(name, "C:", 2) || !strncmp(name, "c:", 2)){
- if (*(name+2) == '\\') {
- sprintf(newfname, "%s\\%s", pcv->c_drv, &name[3]);
- } else {
- sprintf(newfname, "%s\\%s", pcv->c_drv, &name[2]);
- }
-
- } else if (!strncmp(newpath, "A:", 2) || !strncmp(newpath, "a:", 2)) {
- if (newpath[3] == 0) {
- sprintf(newfname, "%s\\%s", pcv->a_drv, name);
- } else {
- if (*(newpath+2) == '\\') {
- sprintf(newfname, "%s\\%s\\%s", pcv->a_drv, &newpath[3], name);
- } else {
- sprintf(newfname, "%s\\%s\\%s", pcv->a_drv, &newpath[2], name);
- }
- }
-
- } else if (!strncmp(newpath, "B:", 2) || !strncmp(newpath, "b:", 2)) {
- if (newpath[3] == 0) {
- sprintf(newfname, "%s\\%s", pcv->b_drv, name);
- } else {
- if (*(newpath+2) == '\\') {
- sprintf(newfname, "%s\\%s\\%s", pcv->b_drv, &newpath[3], name);
- } else {
- sprintf(newfname, "%s\\%s\\%s", pcv->b_drv, &newpath[2], name);
- }
- }
-
- } else if (!strncmp(newpath, "C:", 2) || !strncmp(newpath, "c:", 2)) {
- if (newpath[3] == 0) {
- sprintf(newfname, "%s\\%s", pcv->c_drv, name);
- } else {
- if (*(newpath+2) == '\\') {
- sprintf(newfname, "%s\\%s\\%s", pcv->c_drv, &newpath[3], name);
- } else {
- sprintf(newfname, "%s\\%s\\%s", pcv->c_drv, &newpath[2], name);
- }
- }
-
- } else {
- strsfn(pcv->currentPath, drv, path, node, ext);
- if (*newpath != 0) {
- sprintf(newfname, "%s%s\\%s\\%s", drv, path, newpath, name);
- } else {
- sprintf(newfname, "%s%s\\%s", drv, path, name);
- }
- }
- }
-
- /******************************************************************************
- * retpastf(): 元のテキストをロード
- ******************************************************************************
- * 引数: ComVal *pcv 共通変数へのポインタ
- */
- void retpastf(ComVal *pcv)
- {
- int buff;
-
- if (pcv->pastFno < 1)
- return;
-
- buff = pcv->mloadFlag;
- pcv->pastFno--;
- strcpy(pcv->currentFname, &(pcv->pastFname[pcv->pastFno][0]));
- strcpy(pcv->currentPath, &(pcv->pastPath[pcv->pastFno][0]));
-
- if (pcv->fcache && pcv->depth > 0)
- pcv->depth--;
- GetData(pcv, pcv->currentFname);
-
- pcv->mloadFlag = buff;
- pcv->ofset = pcv->pastofset[pcv->pastFno];
- CMValueSet(pcv->volHdl, pcv->ofset);
- drawGraph(pcv, 0);
- }
-
- /******************************************************************************
- * play_music(): musicファイル演奏
- ******************************************************************************
- * 引数: ComVal *pcv 共通変数へのポインタ
- */
- void play_music(ComVal *pcv, char *tempfname)
- {
- char buff[256],buffm[512],buff2[512];
- char drv[TS_NAMEMAX],path[TS_NAMEMAX],node[TS_NAMEMAX],ext[TS_NAMEMAX];
- char mdrv[TS_NAMEMAX];
- char execfname[90];
- char command[90];
- FILE *fn;
- int i;
-
- fn = fopen(tempfname, "rt");
- if (fn == NULL) {
- DMError(D_CONFIRM,"ファイルが見つかりません!");
- return;
- }
-
- if (!pcv->mzTask) {
- EMEnCross();
- while(1) {
- fgets(buffm, 512, fn); /* 一行読み込み */
- if (buffm[0] == 0)
- break;
- if (!strncmp(strlwr(buffm),
- ".adpcm_block_data", 17)) {
- for(i=17;i<256;i++) {
- if ((buffm[i] != ' ') &&
- (buffm[i] != '=') &&
- (buffm[i] != 9))
- break;
- }
- strsfn(tempfname,drv,path,node,ext);
- strcpy(mdrv, drv);
- strcat(mdrv, path);
- buff2[0] = 0;
- strncpy(buff2, buffm, 17);
- buff2[17] = 0;
- strcat(buff2, " ");
- strcat(buff2, mdrv);
- strcat(buff2, "\\");
- strcat(buff2, &buffm[i]);
- exec_zms(buff2);
- } else {
- exec_zms(buffm);
- }
- }
- fclose(fn);
- EMDeCross();
- } else {
- fclose(fn);
- command[0] = sprintf(&command[1], "%s %s", pcv->mzOpt, tempfname);
- pcv->mzTask = TSFockB(0, 0, pcv->mzFname, command, 0, execfname);
- if (pcv->mzTask < 0) {
- sprintf(command ,"%s:が見つかりません!", pcv->mzFname);
- DMError(D_CONFIRM, command);
- pcv->mzTask = 0;
- return;
- }
- strcpy(pcv->zmsfname, tempfname);
- }
- pcv->mloadFlag = 1;
- CMShine(pcv->btn10Hdl,C_ACTIVE);
- CMShine(pcv->btn11Hdl,C_ACTIVE);
- }
-
- /******************************************************************************
- * play_pcm(): pcmファイル演奏
- ******************************************************************************
- * 引数: ComVal *pcv 共通変数へのポインタ
- */
- void play_pcm(ComVal *pcv, char *tempfname)
- {
- char execfname[90];
- char command[90];
- FILE *fn;
- void **pcm;
- long fileLen;
-
- fn = fopen(tempfname, "rb");
- if (fn == NULL) {
- DMError(D_CONFIRM,"ファイルが見つかりません!");
- return;
- }
-
- if (!pcv->pcmTask) {
- fseek(fn, 0L, SEEK_END);
- fileLen = ftell(fn); /* ファイルサイズを求める */
- fseek(fn, 0L, SEEK_SET);
- pcm = NULL;
- pcm = MMChHdlNew(fileLen); /* PCMメモリ確保 */
- if (pcm == NULL) {
- DMError(D_CONFIRM | D_RED,
- "メモリが確保できません!");
- fclose(fn);
- return;
- }
- MMHdlLock(pcm);
- fread(*pcm, sizeof(char), (size_t) (fileLen), fn);
- fclose(fn);
- MMHdlUnlock(pcm);
- ADPCMOUT(*pcm, 4*256+3, fileLen);
- MMHdlDispose(pcm);
- } else {
- fclose(fn);
- command[0] = sprintf(&command[1], "%s %s", pcv->pcmOpt, tempfname);
- pcv->pcmTask = TSFockB(0, 0, pcv->pcmFname, command, 0, execfname);
- if (pcv->pcmTask < 0) {
- sprintf(command ,"%s:が見つかりません!", pcv->pcmFname);
- DMError(D_CONFIRM, command);
- pcv->pcmTask = 0;
- return;
- }
- }
- }
-
- /******************************************************************************
- * disp_pic(): 画像ファイル処理
- ******************************************************************************
- * 引数: ComVal *pcv 共通変数へのポインタ
- */
- void disp_pic(ComVal *pcv, char *command, char *path, char *destfname, char *taskfname)
- {
- char execfname[90];
-
- if (pcv->picTask != 0 && pcv->picOff)
- taskoff(pcv);
- structfname(pcv, path, destfname, taskfname);
- if (strchr(taskfname, '.') == 0) {
- if (!strncmp(command, "JPEGED", 6) || !strncmp(command, "JPGL", 4))
- strcat(taskfname, ".JPG");
- if (!strcmp(command, "PIC"))
- strcat(taskfname, ".PIC");
- if (!strcmp(command, "PIC2"))
- strcat(taskfname, ".P2");
- if (!strcmp(command, "GLM"))
- strcat(taskfname, ".GLM");
- if (!strcmp(command, "KT"))
- strcat(taskfname, ".PIC");
- }
- command[0] = sprintf(&command[1], "%s %s", pcv->picOpt, taskfname);
- pcv->picTask = TSFockB(0, 0, pcv->picFname, command, 0, execfname);
-
- if (pcv->picTask < 0) {
- sprintf(command ,"%s:が見つかりません!", pcv->picFname);
- DMError(D_CONFIRM, command);
- pcv->picTask = 0;
- }
-
- }
- STR@ I] EdEV 3.00 <